﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity.Owin;
using Owin;
using CorreoSocialWeb.Models;
using CorreoSocialWeb.Views;

using Subgurim.Controles;
using Subgurim.Controles.GoogleChartIconMaker;

namespace CorreoSocialWeb.Controls
{
    public partial class EditarEnvioUserControl : System.Web.UI.UserControl
    {
        private FormViewEnvioControlHelper ViewControls;
        private CoordenadasDeSesionHelper CoordenadasDeSesion;

        private Models.Envio item;

        public Models.Envio Item
        {
            get
            {
                return item;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.Page.PreRenderComplete += Page_PreRenderComplete;

            this.ViewControls = new FormViewEnvioControlHelper(this);
            this.CoordenadasDeSesion = new CoordenadasDeSesionHelper(this.Page);

            var titulo = string.Format("{0} Envío", this.AgregandoItem ? "Nuevo" : "Editar");
            this.Page.Title =
            this.LabelTitulo.Text = titulo;

            if (this.IsPostBack)
                return;

            this.LabelError.Text = string.Empty;
            this.PanelVolverError.Visible = false;
            this.PanelForm.Visible = true;

            Mapa.enableDragging = false;
            Mapa.Language = "es";
            Mapa.BackColor = System.Drawing.Color.White;

            // las coordenadas las cargo después, al obtener el item para insertar o editar
            this.CoordenadasDeSesion.Borrar();

            this.CargarItem();
        }

        private void GetItem()
        {
            item = new Models.Envio();

            if (!this.AgregandoItem)
            {
                var usuarioId = new Views.UsuarioDePaginaHelper().GetUsuarioId(this.Context);

                item = Models.Envio.GetParaEditar(usuarioId, this.ItemId.Value);
            }
        }

        void Page_PreRenderComplete(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;

            if (!this.PanelForm.Visible)
                return;

            this.DataBind();
        }

        protected void Control_OnPreRender(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;

            if (!this.PanelForm.Visible)
                return;

            this.DataBind();
        }

        public IQueryable DropDownListTamanoDePaquete_SelectMethod()
        {
            return TamanoDePaqueteComboItemsHelper.Get().AsQueryable();
        }

        protected string Mapa_Click(object s, GAjaxServerEventArgs e)
        {
            var coordenadas = new CoordenadasDeSesionHelper(this.Page);

            return CargadorDeMarkers.MapaClick(this.Mapa, coordenadas, e);
        }

        protected void LinkButtonLimpiarMapa_Click(object sender, EventArgs e)
        {
            this.LimpiarMapa();
        }

        private void LimpiarMapa()
        {
            Views.MapaHelper.Limpiar(this.Mapa);

            this.CoordenadasDeSesion.Borrar();
        }

        protected void LinkButtonCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Envios/MisEnvios", false);
        }

        protected void LinkButtonGuardar_Click(object sender, EventArgs e)
        {
            this.GuardarItem();
        }

        private void LimpiarLabels()
        { 
            this.LabelError.Text =

            this.LabelErrorOrigen.Text = 
            this.LabelErrorDestino.Text = 

            this.LabelErrorTamanoDePaquete.Text =
            
            this.LabelErrorHoraDeSalida.Text =
            this.LabelErrorHorarioDeLlegada.Text = 

            this.LabelErrorFechaDeSalida.Text = 

            this.LabelErrorCoordenadaOrigen.Text = 
            this.LabelErrorCoordenadaDestino.Text = string.Empty;
        } 

        public void GuardarItem()
        {
            ErroresHelper errores = new ErroresHelper();
            var db = new CorreoSocialDbContext();
            var item = new CorreoSocialWeb.Models.Envio();
            
            try
            {
                LimpiarLabels();

                CargarMarkers();

                var usuarioId = new UsuarioDePaginaHelper().GetUsuarioId(this.Context);

                if (!this.AgregandoItem)
                    item = Models.Envio.GetParaEditar(db, usuarioId, this.ItemId.Value);

                if (!this.ViewControls.Validar(errores))
                {
                    this.LabelError.Text = "Hubo errores de validación. Revisá los valores ingresados y volvé a intentarlo.";
                    return;
                }

                item.Origen = this.ViewControls.Origen.Trim();
                item.Destino = this.ViewControls.Destino.Trim();

                item.HoraDeSalida = this.ViewControls.HoraDeSalida;
                item.MinutosDeSalida = this.ViewControls.MinutosDeSalida;

                item.HoraDeLlegada = this.ViewControls.HoraDeLlegada;
                item.MinutosDeLlegada = this.ViewControls.MinutosDeLlegada;

                item.FechaDeSalida = this.ViewControls.FechaDeSalida;

                item.TamanoDePaqueteId = this.ViewControls.TamanoDePaqueteId;

                item.CoordenadasOrigen = this.CoordenadasDeSesion.Origen;
                item.CoordenadasDestino = this.CoordenadasDeSesion.Destino;

                item.Notas = this.ViewControls.Notas;

                if (item.EsNuevo)
                {
                    // busco asignarle el usuario al envío, si es que es nuevo
                    item.UsuarioId = usuarioId;
                    item.EstadoEnu = EstadoDeEnvioEnu.SeleccionandoMensajero;
                    db.Envios.Add(item);
                }

                db.SaveChanges();
            }
            catch
            {
                this.LabelError.Text = "Hubo un error al guardar el Envío. Por favor, intentá nuevamente más tarde.";
                return;
            }

            Response.Redirect("~/Envios/MisEnvios", false);
        }

        private int? ItemId
        {
            get
            {
                if (Request.QueryString["Id"] != null)
                    return int.Parse(Request.QueryString["Id"]);

                return null;
            }
        }

        private bool AgregandoItem
        {
            get
            {
                return !this.ItemId.HasValue;
            }
        }

        public void CargarItem()
        {
            this.LimpiarMapa();

            try
            {
                this.GetItem();

                if (this.Item == null)
                    throw new Exception("Envío no encontrada.");

                this.CargarMarkers(this.Item);
            }
            catch
            {
                this.LabelError.Visible = true;
                this.LabelError.Text = "Error al obtener envío.";
                this.PanelForm.Visible = false;
                this.PanelVolverError.Visible = true;
            }
        }

        private void CargarMarkers(Envio item)
        {
            this.CoordenadasDeSesion.Cargar(item);

            CargarMarkers();
        }

        private void CargarMarkers()
        {
            CargadorDeMarkers.Cargar(this.CoordenadasDeSesion, this.Mapa);
        }
    }
}